//
//  WTStatus.swift
//  WTSinaWeibo
//
//  Created by  Wellim on 16/6/27.
//  Copyright © 2016年  Wellim. All rights reserved.
//

import UIKit

class WTStatus: NSObject {
    /// 微博创建时间
    var created_at: String?
    /**
     *  微博ID
     */
    var id: Int64 = 0
    /**
     *  微博信息内容
     */
    var text: String?{
    
        didSet{
        
         textAttr = getWeiboAttr(text ?? "")
        
        }
     
     }
    /**
     *  微博来源
     */
    var source: String?{
    
     
        didSet{
        sourceAttr = getSoureceStr(source)
        
        }
    
    
    }
    /**
     *  用户信息
     */
    var user: WTUser?
    // 转发微博
    var reposts_count:Int = 0{
    
        didSet{
        repostsStr = getCountString(reposts_count, title: "转发")
        }
    }
    //评论数
    var comments_count:Int = 0 {
    
        didSet{
        
        commentsStr = getCountString(comments_count, title: "评论")
        }
    
    }
    //表态数
    var attitudes_count:Int = 0 {
        
        didSet{
            
            attitudesStr = getCountString(attitudes_count, title: "赞")
        }
        
    }
    
    
    //	int	转发数
    var repostsStr: String?
    //	int	评论数
    var commentsStr: String?
    //	int	表态数
    var attitudesStr: String?
    
    // 转发微博
    var retweeted_status: WTStatus?
    
   // 配图数组
    var pic_urls: [WTPictureInfo]?
     //  微博来源的属性字符串
    var sourceAttr: NSMutableAttributedString?
    
    //微博创建的时间
    var createdStr:String?{
    
      return getWeiboTimeStr(created_at ?? "")
        
    }
    
    // 微博内容使用的富文本
    var textAttr:NSMutableAttributedString?
    
    
    
    // MARK: - 字典转模型的方法
   init(dict:[String:AnyObject]) {
        
        super.init()
        
        setValuesForKeysWithDictionary(dict)
        
    }
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
        
        
    }
    
    
    
    
    
    override var description: String{
        
        let keys = ["created_at","id","text","source"]
        
        return dictionaryWithValuesForKeys(keys).description
        
        
    }

    override func setValue(value: AnyObject?, forKey key: String) {
        if key == "user" {
            
            // 判断可选值是否存在 而且是否能转成字典
            guard let v = value as? [String: AnyObject] else{
                print("可选值不存在 或者是不能转成字典")
                return
                
            }
            // 需要我们程序员手动字典转模型
            let u = WTUser(dict: v)
            // 需要程序员自己对该属性赋值
            user = u
            
            
        }else if key == "retweeted_status"{
            
            // 判断可选值是否有值 而且是否可以转成字典
         guard  let v = value as?[String :AnyObject] else{
            
             return
            }
            let s = WTStatus(dict: v)
            
            retweeted_status = s
        
        
        }else if key == "pic_urls"{
        
            guard let vArray = value as? [[String :AnyObject]] else{
            
              return
            }
            // 创建一个临时数组
            var tempArray:[WTPictureInfo] = [WTPictureInfo]()
            // 遍历数组
            for dict in vArray {
                
                let p = WTPictureInfo(dict: dict)
                
                tempArray.append(p)
            }
            
            //pic_urls赋值
            pic_urls = tempArray
            
        
        }else{
            // 如果重写了setValue for Key 我还需要系统帮我们通过kvc字典转模型 需要父类
            super.setValue(value, forKey: key)
          
        
        }
        
        
        
    }
    
    
    /*
     在toolbar 抽取进来的
     - 底部toolbar 显示的转发评论赞 格式----业务需求
     - 如果 count <= 0
     - 显示格式： 转发 评论 赞 文字
     - 如果 count > 0 && count < 10000
     - 显示格式: 是多少显示多少 例如 8888  显示 8888
     - 如果 count >= 10000
     - 显示格式: x.x 万  例如 12000  显示 1.2 万
     -  例如 10000  显示 1万  20000  显示 2万 x万
     
     */

    func getCountString(count: Int,title: String) -> String {
        
        if count <= 0 {
            
            return title
        }else if count > 0 && count < 10000{
        
           return "\(count)"
        
        }else{
        
            let countF = CGFloat(count / 10000)/10
            var countStr = "\(countF)"
            // containsString --》判断字符串是否包含字符串
            if countStr.containsString(".0") {
                
                countStr = countStr.stringByReplacingOccurrencesOfString(".0", withString: "")
            }
            
            return "\(countStr)万"
        }
        
        
    }
    
     //处理微博来源字符串
    func getSoureceStr(source: String?) -> NSMutableAttributedString {
    // 判断可选值是否有值 而且是否包含"> 字符串
        guard let s = source where s.containsString("\">") else{
        
            let r = "来自 Wellim工作室"
            return getSourceAttr(r)
        }
        // 字符串的截取
        let star = s.rangeOfString("\">")!
        let end = s.rangeOfString("</a")!
        // 字符串截取
        let result = s.substringWithRange(star.endIndex..<end.startIndex)
        
        // 完成字符串拼接
        let r = "来自 \(result)"
        
        return getSourceAttr(r)
        
    }
    
    // 通过字符串生成富文本
    
    func getSourceAttr(result:String) -> NSMutableAttributedString {
        
        // 实例化一个富文本
        let attr = NSMutableAttributedString(string: result)
        //获取range
        let rang = (result as NSString).rangeOfString("来自")
        
        // 设置属性
        attr.addAttributes([NSForegroundColorAttributeName:ThemeColor], range: rang)
        
        return attr
        
        
    }
  
    
    
    
    
    
    
}

extension WTStatus{

    /*
     - 微博时间业务逻辑需求
     - 如果是今年
     - 如果是今天
     -  如果小于60秒 显示格式: 刚刚
     -  如果 s>=60 && s < 60 * 60  显示格式:xx分钟前
     -  如果 s>= 60*60  显示格式: xx小时前
     - 如果是昨天
     -  2016-06-29 12:12:12  显示格式: 昨天 12:12
     - 如果是其他
     -  2016-06-12 13:13:13  显示格式: 06月12日 13:13
     - 如果不是今年
     - 2015-05-05 10:10:10 显示格式: 2015年05月05日 10:10
     */
    // 处理微博时间方法
    func getWeiboTimeStr(creatAt: String) -> String {
        //Thu Jun 30 11:21:04 +0800 2016    ---- +0800 时区 z
        // 时间格式
        let df = NSDateFormatter()
        // 格式
        df.dateFormat = "EEE MMM dd HH:mm:ss z yyyy"
        // 设置地区 （如果在真机上 可能出现时间不对 需要程序员记得设置）
        df.locale = NSLocale(localeIdentifier: "en_US")
        // 微博时间
        let weiboDate = df.dateFromString(creatAt)!
        
        // 判断是否是今年
        let isThisYear:Bool = getWeiboIsThisYear(weiboDate)
        
        // 代表是今年
        if isThisYear {
            // 日历类
            let calendar = NSCalendar.currentCalendar()
            // 如果是今天
            if calendar.isDateInToday(weiboDate) {
                // 秒数差值
                let s = NSDate().timeIntervalSinceDate(weiboDate)
                //如果小于60秒 显示格式: 刚刚
                if s < 60 {
                    return "刚刚"
                }else if s >= 60 && s < 60 * 60{
                    //显示格式:xx分钟前
                    return "\(Int(s/60))分钟前"
                    
                }else{
                    //显示格式: xx小时前
                    return "\(Int(s/3600))小时前"
                }
                
            }else if calendar.isDateInYesterday(weiboDate){
                // 昨天 显示格式: 昨天 12:12
                df.dateFormat = "昨天 HH:mm"
                return df.stringFromDate(weiboDate)
                
            }else{
                
                // 其他 显示格式: 06月12日 13:13
                df.dateFormat = "MM月dd日 HH:mm"
                return df.stringFromDate(weiboDate)
                
            }
            
        }else{
            // 代表不是今年 显示格式: 2015年05月05日 10:10
            df.dateFormat = "yyyy年MM月dd日 HH:mm"
            let rusult = df.stringFromDate(weiboDate)
            return rusult
        }
        
        
        
    }
    
    // 判断微博时间是否是今年
    func getWeiboIsThisYear(weiboDate: NSDate) -> Bool {
        
        let df = NSDateFormatter()
        // 设置地区 （如果在真机上 可能出现时间不对 需要程序员记得设置）
        df.locale = NSLocale(localeIdentifier: "en_US")
        //格式
        df.dateFormat = "yyyy"
        //微博时间
        let weiboTimeStr = df.stringFromDate(weiboDate)
        // 当前时间
        let currentTimeStr = df.stringFromDate(NSDate())
        // 代表是今年
        if weiboTimeStr == currentTimeStr {
            
            return true
        }else{
            // 代表不是今年
            return false
        }
        
        
        
        
    }




}

extension WTStatus{

    /*
     
     aaa[马到成功]aaa  最终显示在cell上 aaa表情aaa
     
     aaaa[嘿嘿]bbbb[笑笑] range loc=4 len=4     笑笑  rang
     loc = 12  len 4
     正序行不同 //aaaa表bbbb[笑笑]
     倒序 aaaa[嘿嘿]bbbb表
     */
    func getWeiboAttr(text: String) -> NSMutableAttributedString{
        // 正则匹配格式
        // 通过正则匹配结果
        let resultAttr = NSMutableAttributedString(string: text)
        
        // 定义一个保存模型的数组
        var matchArray: [WTMatchResult] = [WTMatchResult]()
        
        (text as NSString).enumerateStringsMatchedByRegex("\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]") { (count, string, range, _) in
            
            // 转模型保存数组
            let matchRusult = WTMatchResult(srting: string.memory as! String, range: range.memory)
            
            // 保存数据
            matchArray.append(matchRusult)
            
        }
         // 倒序遍历
        for match in matchArray.reverse() {
            
            let emoticon = WTEmoticonTools.sharedEmoticonTools.getSearchEmoticon(match.string)
            // 文本附件
            let att = NSTextAttachment()
            let path = emoticon?.path ?? ""
            let png = emoticon?.png ?? ""
            let name = path + png
            
            // 设置image
            att.image = UIImage(named: name, inBundle: WTEmoticonTools.sharedEmoticonTools.emotionBundle, compatibleWithTraitCollection: nil)
            // 行高
            let lineHeight = UIFont.systemFontOfSize(15).lineHeight
            // 设置bounds
            att.bounds = CGRect(x: 0, y: -4, width: lineHeight, height: lineHeight)
            
            let attr = NSAttributedString(attachment: att)
            
            resultAttr.replaceCharactersInRange(match.range, withAttributedString: attr)
        }
        
        
        return resultAttr
    }






}

